<?php if (!defined('FIT_PATH')) exit('No direct script access allowed');
/**
 * @copyright 2009 - 2011 Bincent.com. All Rights Reserved.
 * @license http://www.apache.org/licenses/LICENSE-2.0
 * @package	FitPHP
 * @subpackage library
 * 
 * @author Hongbin Hsu <hongbin.hsu@gmail.com> Initial.
 * @version $Id: library/redis.php 1.0 2012-02-168 10:11 hongbin.hsu $
 */

class Library_Redis
{
	public $pconnect = true;            			//是否使用持久连接
	protected $conn = null;                         //redis连接句柄
	private $is_install = false;					//已经安装Redis扩展
	private $redis_db = 0;							//redis数据库索引号
	
	//----------------------------------------------------------
	/**
	 * 构造函数
	 *
	 * @param  $policy      默认的缓存策略
	 */
	public function __construct()
	{
		$this->check_install();
		if ($this->is_install) {
			$this->conn = new Redis();
		}
	}
	
	//----------------------------------------------------------
	/**
	 * 增加缓存服务器
	 *
	 * @param string $host  服务器名称
	 * @param string $port  服务器端口
	 */
	public function add_server($host, $port = 6379)
	{
		if ($this->is_install) {
			if ($this->pconnect) {
				$this->conn->connect($host, intval($port)); 
			}else{
				$this->conn->pconnect($host, intval($port)); 
			}
		}
	}
	
	//----------------------------------------------------------
	/**
	 * 选择Redis数据
	 *
	 * @param int $db
	 */
	public function select($redis_db = 0)
	{
		$this->redis_db = intval($redis_db);
		if ($this->is_install) {
		    $this->conn->select($this->redis_db);
		}
	}
	
	//----------------------------------------------------------
	/**
	 * 写入缓存
	 * 将key和value对应。如果key已经存在了，它会被覆盖，而不管它是什么类型。
	 * 
	 * @param string $key
	 * @param mixed $data
	 */
	public function set($key, $data)
	{
		if ($this->is_install) {
			$this->conn->set($key, $data);
		}
	}
	
	//----------------------------------------------------------
	/**
	 * 唯一性保存
	 * 如果key不存在，就设置key对应字符串value。在这种情况下，该命令和SET一样。
	 * 当key已经存在时，就不做任何操作。SETNX是“SET if Not eXists”
	 * 
	 * @param string $key
	 * @param mixed $data
	 * 
	 * @return int [1 如果key被set] [0 如果key没有被set]
	 */
	public function setnx($key, $data)
	{
		if ($this->is_install) {
			return $this->conn->setnx($key, $data);
		}
	}
	
	//----------------------------------------------------------
	/**
	 * 带超时过期的保存
	 * 设置key对应字符串value，并且设置key在给定的seconds时间之后超时过期。
	 *
	 * @param string $key
	 * @param mixed $data
	 * @param int $lift_time
	 * 
	 * @return string 状态码
	 */
	public function setex($key, $data, $life_time)
	{
		if ($this->is_install) {
			$life_time = intval($life_time);
			return $this->conn->setex($key, $life_time, $data);
		}
	}
	
	//----------------------------------------------------------
	/**
	 * 读取缓存，读取失败或缓存失效返回false
	 *
	 */
	public function get($key)
	{
		if ($this->is_install) {
			return $this->conn->get($key);
		}
	}
	
	//----------------------------------------------------------
	/**
	 * 删除Redis中的数据
	 *
	 * @param array $keys
	 * @return int	// 影响的条数
	 */
	public function delete($keys = array())
	{
		if (!is_array($keys)) { $keys = array($keys); }
		if ($this->is_install) {
			return $this->conn->delete($keys);
		}else{
		    return 0;
		}
	}
	
	//----------------------------------------------------------
	/**
	 * 清空当前Redis数据库
	 *
	 */
	public function flush()
	{
	    if ($this->is_install) {
	    	$this->conn->flushDB($this->redis_db);
	    }
	}
	
	//----------------------------------------------------------
	/**
	 * 检查否是否存在
	 */
	private function check_install(){
		$this->is_install = extension_loaded('Redis');
	}
}